package com.cskayan.javase.object._3equals;

/**
 * 使用equals方法在判断排它性时的两种方式:
 *      1.getClass
 *          判断排它性,是非常严格的,因为只有当完全是同种类型对象时,才会返回返回true
 *          根本不管什么继承,子类等这些东西.
 *
 *      2.instanceof
 *          引用 instanceof 类名/接口
 *          判断引用所指向的对象是否是后面类名的对象或者子类对象
 *              如果是抽象类或者接口,只能是子类对象
 *
 *         判断排它性
 *              没有getClass严格
 *              方法可以接受这个类型的对象传入
 *              还可以接受这个类型的子类对象的传入
 *
 *
 * @since 16:57
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo2 {
    public static void main(String[] args) {
        // String str = "hello world!";
        Cat c1 = new Cat(1, 1000);
        Cat c2 = new Cat(1, 1000);
        System.out.println(c1.equals(c2));

        CatSon catSon = new CatSon(1, 1000);
        System.out.println(c1.equals(catSon));
    }
}

class Cat {
    int age;
    double price;

    @Override
    public boolean equals(Object obj) {
        // 1,满足自反性
        if (this == obj) {
            return true;
        }
        // 2.用instanceof判断排它性
       /* if (!(obj instanceof Cat)) {
            return false;
        }*/

        // 2.用getClass方法判断排它性
        if (obj == null || obj.getClass() != this.getClass()) {
            return false;
        }

        // 3.对称性,一致性,传递性,用成员变量的取值判断对象相等,自动满足
        Cat target = (Cat) obj;
        if (age != target.age) {
            return false;
        }
        // return price == target.price;
        return Double.compare(price, target.price) == 0;
    }

    public Cat() {
    }

    public Cat(int age, double price) {
        this.age = age;
        this.price = price;
    }
}

class CatSon extends Cat {
    public CatSon() {
    }

    public CatSon(int age, double price) {
        super(age, price);
    }
}